package com.tanhua.app.controller;

import com.tanhua.UserHolder;
import com.tanhua.app.service.UserService;
import com.tanhua.db.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *测试作用范围：
 *  @Scope:相当于bean标签的scope属性
 *      作用：用于调整bean的作用范围
 *      使用位置: 被创建的类上
 *      属性：
 *          value：指定作用范围的取值。取值是固定的5个，和XML的配置取值是一样的。
 *          singleton: 单实例 默认值
 *          prototype: 多实例
 *生命周期:
 *  @PostConstruct  : 用在方法上
 *      使用位置: 初始化的方法上
 *  	​   作用：指定初始化方法，相当于init-method
 *  @PreDestroy     : 使用在方法上
 *  	作用：指定销毁方法，相当于destroy-method
 */
//@Scope("prototype")
//@Component    //用于创建对象,将创建的对象存放到IOC容器中
//     value: 设置存放到IOC容器中id的值,如果不写默认为当前类的类名称,首字母小写
//以下三个注解跟@Component注解的作用一样,只不过下面三个注解提供了更加详细的语义化(见名知意)
//@Controller  // : 将web层的类创建对象存放到IOC容器中
//@Service     // : 将serice层的类创建对象存放到IOC容器中
//@Repository  // : 将dao层的类创建对象存放到IOC容器中
@RestController//等价于 @Controller + @ResponseBody
public class UserInfoController {

    @Autowired
    private UserService userService;

    /**
     * 处理器适配器
     *
     * 类型：类注解 方法注解 位置：类上方 方法上方
     * @RequestMapping("/test01")
     * url:localhost:8080/aa 访问路径
     * 作用: 建立请求路径与此方法的对应关系
     * http://localhost:8080/hello--->com.heima.controller.HelloController#hello()
     * 类上:窄化类,访问此类中的方法时,必须加上类上的路径 /类上的路径/方法上的路径
     * 方法:建立绑定路径与方法的对应关系
     *      绑定路径:
     *              如果定义在类上 /aa  下面方法 /bb 资源完全匹配 url:localhost:8080/aa/bb
     *              完全匹配: 如果访问路径url配全匹配，那么就使用完全匹配的访问（不管什么后缀，都被匹配）
     *                    否则使用目录匹配
     *                    最后使用后缀匹配
     *              目录匹配: /* 、 /user/*
     *              后缀名匹配: *.do 、 *.jsp 、 *.abc
     *              缺省匹配: /   (匹配除jsp以外的所有路径)
     * 属性：
     *      响应字符串【开发主流的方式】
     *      名称：produces
     *      类型：@RequestMapping 属性
     *      作用：指定响应字符串的数据类型,告诉浏览器解析字符串的规则实
     *      范例：@RequestMapping(value = "/test1",produces ="application/json;charset=UTF-8" )
     *
     * 名称：类型：方法注解 位置：方法上方
     * @ResponseBody    //作用：获取请求体中的数据json格式并反序列化成Vo对象 避免视图解析，直接响应字符串数据
     *           原生api: response.getWriter. print()/write();
     *                  1.如果返回值是void但配置了视图解析器。视图解析器还是会返回一个页面。
     *                      添加了该注解可以跳过视图解析器，不让视图解析器返回页面
     *                  2.返回普通字符串
     *                  3.如果返回是对象，该注解会将对象序列化为json格式字符串返回
     *                      (底层调用了类型处理器，使用springmvc内置的jackson转换工具进行类型转换)
     *
     *              位置：方法中形参
     *              @RequestBody    //post请求时 将对象序列化成json格式的字符串 范例：demo01(@RequestBody UserVO userVO)
     *
     *
     * rest风格       请求路径中 {占位符} 接收请求路径中当前位置的值
     * @GetMapping	    //GET（查询）    @GetMapping("/{userName}/{userAge}")     //等价于@RequestMapping+method = RequestMethod.GET
     * @PostMapping     //POST（保存）   @PostMapping("/{userName}/{userAge}")    //等价于@RequestMapping+method = RequestMethod.POST
     * @PutMapping	    //PUT（更新）    @PutMapping("/{id}/{userName}/{userAge}")//等价于@RequestMapping+method = RequestMethod.PUT
     * @DeleteMapping	//DELETE（删除） @DeleteMapping(value = "/{id}")          //等价于@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
     *
     *        位置：方法中形参
     *   		   @PathVariable  解析请求路径中的值,并将值赋给形参变量  范例：@PathVariable("userName") String name)

     * @return 默认的请求方式：转发
     *          配置视图解析器的公共目录路径（配置资源前缀）
     *          配置视图的扩展名称（配置后缀）
     *          WEB-INF/pages/路径下的 XXX.jsp 文件
     *
     *springmvc api:
     *
     *  请求转发： forward   数据保存到 request 域对象中
     *      原生api ：request.setAttribute()
     *      forward ：+物理视图路径
     *          return "forward:/WEB-INF/pages/success2.jsp";
     *      forward ：+逻辑视图,通过视图解析器解析成物理视图
     *          return "forward:/test02";
     *
     *  响应重定向：redirect
     *      原生 api:response.sendRedirect()
     *      redirect :+物理视图路径（可以是服务器内部资源+也可以是其他服务资源）
     *      服务器内部：资源url格式：
     *
     *          方式1：服务器内部的jsp要在WEB-INF之外
     *              return "redirect:/index.jsp";
     *          方式2：重定向到某一个handler下的某个访问方法
     *              return "redirect:/test06";
     *          方式3：重定向的外部服务器下
     *              return "redirect:http://www.baidu.com";
     *
     * 转发 响应重定向 共享数据        Model 和 ModelAndView 底层都是使用request域进行封装数据
     *
     *     Model           (Model model)设置方法形参 .setAttribute("name",Object o);
     *     ModelAndView   （ModelAndView mv） 设置方法形参 返回：ModelAndView  将 Model 或者 ModelAndView 中的数据以参数的形式拼接到请求ur1地址下;
     *        					    mv.addObject("name",Object o);
     * 			                    //mv下的视图可写物理视图，也可以写逻辑视图
     * 			                     mv.setViewName("result");
     *
     */
    @GetMapping(value = "/users" ,name="登录用户的数据回显")

    public ResponseEntity findUserInfoVo( Long userID, Long huanxinID){//@RequestHeader("Authorization") String token,
        if (userID != null) {
            //1.根据userID查询
            return userService.findUserInfoVo(userID);

        } else if (huanxinID != null) {
            //2.根据huanxinID查询
            return userService.findUserInfoVo(huanxinID);

        } else {
            //根据huanxinID查询     从拦截器 将资源从线程容器中获
            User user = UserHolder.getUser();
            //3.根据huanxinID查询
            //User user = userService.findByToken(token);

            return userService.findUserInfoVo(user.getId());
        }



    }
}
